package com.hyt.it.ogt.kq.service.gov.model.excel.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.metadata.holder.ReadRowHolder;
import com.hyt.core.util.UUIDUtils;
import com.hyt.it.ogt.kq.service.gov.model.excel.ImportTaskCandidateSheet;
import com.hyt.it.ogt.kq.common.gov.utils.TextUtil;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author wangrl
 * @since 2021/9/3
 */

@Slf4j
public class TaskCandidateListener extends AbstractAnalysisListener<ImportTaskCandidateSheet> {

    /**
     * 原子数据
     */
    private List<ImportTaskCandidateSheet> list ;

    /**
     * 去重复
     */
    private List<ImportTaskCandidateSheet> noRepeatList ;

    /**
     * 用于去重判断
     */
    private Map<String, String> idNumberMap;


    /**
     * 构造器入参任务id
     */
    private String taskId;

    public TaskCandidateListener(String taskId) {
        this.taskId = taskId;
        this.list = new ArrayList<>();
        this.noRepeatList = new ArrayList<>();
        this.idNumberMap = new HashMap<>() ;
    }

    /**
     * 这个每一条数据解析都会来调用
     *
     * @param data
     * @param context
     */
    @Override
    public void invoke(ImportTaskCandidateSheet data, AnalysisContext context) {
        //1.整行记录不能为空
        if (!TextUtil.checkObjAllFieldsIsNull(data)) {
            ReadRowHolder readRowHolder = context.readRowHolder();
            Integer rowIndex = readRowHolder.getRowIndex();
            //2.数据格式验证
            //data.valid(rowIndex);
            String idNumber = data.getIdNumber();
            String repeatUuid = idNumberMap.get(idNumber);
            //3.如果有重复idNumber就将上次的uuid赋值到当前数据对象
            String uuid =  TextUtil.isNotNull(repeatUuid) ? repeatUuid : UUIDUtils.newSortUUID();
            data.setId(uuid);
            data.setTaskId(this.taskId);
            list.add(data);
            //组装不重复数据
            if (TextUtil.isNull(repeatUuid)) {
                this.noRepeatList.add(data);
                idNumberMap.put(idNumber, uuid);
            }
        }
    }

    /**
     * 所有数据解析完成了 都会来调用
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 这里也要保存数据，确保最后遗留的数据也存储到数据库
        log.info("所有数据解析完成，总共{}条", list.size());
    }

    /**
     * 获取验证后的数据
     * @return
     */
    public List<ImportTaskCandidateSheet> getImportTaskCandidates() {
        return this.list;
    }

    /**
     * 获取去重后的数据
     * @return
     */
    public List<ImportTaskCandidateSheet> getImportNoRepeatTaskCandidates() {
        return this.noRepeatList;
    }

}
